Skip to content

Gave the gnu ports a CMake build, which most of them lacked - #607

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:feature/cmake-gnu-ports
Aug 12, 2026
Merged

Gave the gnu ports a CMake build, which most of them lacked#607
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:feature/cmake-gnu-ports

Conversation

@fdesbiens

Copy link
Copy Markdown
Contributor

Problem

The project guidelines ask for CMake and Ninja, but only 15 of the 59 gnu port
directories
had a CMakeLists.txt. None of the 27 AArch64 ports had one, so the
architecture whose examples were repaired over #597, #599 and #602 still could not
be built the way the project says to build it, and nothing in CI could compile it.

Change

44 new CMakeLists.txt. Three of them are templates in ports_arch, because
34 of the 44 are generated. The ARMv7-A and AArch64 source lists are uniform
within each family — checked across every core — so one template per family serves
all of them and update.sh distributes it:

template reaches
ports_arch/ARMv7-A/threadx/ports/gnu 7 ARMv7-A ports
ports_arch/ARMv8-A/threadx/ports/gnu 13 AArch64 ThreadX ports
ports_arch/ARMv8-A/threadx_smp/ports/gnu 14 AArch64 SMP ports

The other 10 ports have no generator and get their own file.

30 new toolchain files, following the shape of cmake/cortex_a9.cmake.
AArch64 needs a base file of its own rather than a variant of
arm-none-eabi.cmake: it has no -marm/-mthumb to choose between and no
-mfloat-abi, and aarch64-none-elf-gcc rejects -mlong-calls outright, so that
flag cannot simply be carried across.

The tools are named without a path, unlike cmake/cortex_r52.cmake, which pins
one. Pinning 30 files to a single machine's directory layout is exactly what #603
removed from the launch configurations, so the majority convention wins here;
override CMAKE_C_COMPILER for a toolchain that is not on PATH.

Three of those files cover ports that already had a CMakeLists.txt but no way
to select it
— the Armv8-M mainline gnu ports cortex_m33, cortex_m55 and
cortex_m85. Without a cmake/<arch>.cmake, the documented invocation cannot
reach them.

One top-level fix. CMakeLists.txt derives the SMP port directory as
<arch>_smp, but ports_smp/linux and ports_smp/win64 predate that convention
and carry no suffix, so neither could ever be configured:

set(TX_ARCH_DIR "${THREADX_ARCH}_smp")
if(NOT IS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/${TX_PORT_DIR}/${TX_ARCH_DIR}")
    set(TX_ARCH_DIR "${THREADX_ARCH}")
endif()

The fallback only fires when the suffixed directory is absent, so no port that
already resolved changes behaviour, and ports_smp/win64's existing
CMakeLists.txt becomes reachable as a side effect.

Verification

Every port was configured and built, not merely written.

53 of 53 static libraries build with cmake -G Ninja, using Arm GNU Toolchain
14.3.Rel1 for both arm-none-eabi and aarch64-none-elf. That is the 44 new
ports plus the 9 that already worked, and it includes ports_smp/linux, which
failed before the fallback and now produces a library. Sizes land where you would
expect: ARMv7-A around 267–270 KB, AArch64 ThreadX around 333 KB, AArch64 SMP
around 400 KB.

  • scripts/check_ports.sh passes, so the three templates and their 34 generated
    copies agree.
  • scripts/check_clang.sh passes unchanged — 42 of 42 script-driven examples and
    5 of 5 Cortex-R52 CMake images. That last one matters, because the R52 CMake
    stage runs through the top-level file this change edits.

All three were re-run after rebasing onto #606, with identical results.

Still outside the CMake build

Six gnu ports, every one for want of a compiler rather than a CMakeLists.txt:

  • rxv1, rxv2, rxv3 need the Renesas RX GNU toolchain, and
    mips32_interaptiv_smp needs a MIPS one. Neither is available here, and writing
    toolchain files for them would mean shipping untested guesses.
  • risc-v32 and risc-v64 already build, through their own differently named
    toolchain files.

Suggested follow-up

Nothing in CI builds any of this yet, which is how the AArch64 ports came to sit
two releases behind in the first place. A workflow running the 53
configure-and-build steps would need the aarch64-none-elf toolchain downloaded
and cached alongside the existing arm-none-eabi one, in the manner
clang_check.yml already caches ATfE.

The project guidelines ask for CMake and Ninja, but only 15 of the 59 gnu port
directories had a CMakeLists.txt. None of the 27 AArch64 ports had one, so the
architecture whose examples were repaired over the last few changes still could
not be built the way the project says to build it, and nothing in CI could
compile it.

Add a CMakeLists.txt to the 44 that lacked one. Three of them are templates in
ports_arch, because 34 of the 44 are generated: the ARMv7-A and AArch64 source
lists are uniform within each family, so one template per family serves every
core in it and update.sh distributes it. The other 10 ports have no generator
and get their own file.

Add the toolchain files those ports select, following the shape of
cmake/cortex_a9.cmake. AArch64 needs a base file of its own rather than a
variant of arm-none-eabi.cmake: it has no -marm or -mthumb to choose between and
no -mfloat-abi, and aarch64-none-elf-gcc rejects -mlong-calls outright, so that
flag cannot be carried across. The tools are named without a path, unlike
cmake/cortex_r52.cmake which pins one, because pinning 30 files to a single
machine's directory layout is the problem the previous change removed from the
launch configurations.

Three toolchain files cover ports that already had a CMakeLists.txt but no way
to select it: the Armv8-M mainline gnu ports, cortex_m33, cortex_m55 and
cortex_m85. Without cmake/<arch>.cmake the documented invocation cannot reach
them.

The top level needed one fix. It derives the SMP port directory as
<arch>_smp, but ports_smp/linux and ports_smp/win64 predate that convention and
carry no suffix, so those two could never be configured. Fall back to the bare
name when the suffixed directory is absent. The check only fires when the
suffixed directory does not exist, so no port that already resolved changes
behaviour, and ports_smp/win64's existing CMakeLists.txt becomes reachable too.

Verified by configuring and building every one: 53 of 53 static libraries build
with cmake -G Ninja, using Arm GNU Toolchain 14.3.Rel1 for both arm-none-eabi
and aarch64-none-elf. That covers the 44 new ports plus the 9 that already
worked, and includes ports_smp/linux, which failed before the fallback.
scripts/check_ports.sh passes, so the three templates and their 34 generated
copies agree.

Six gnu ports are still outside the CMake build, all for want of a compiler
rather than a CMakeLists.txt: rxv1, rxv2 and rxv3 need the Renesas RX GNU
toolchain and mips32_interaptiv_smp needs a MIPS one, neither of which is
available here, so writing toolchain files for them would mean shipping
untested guesses. risc-v32 and risc-v64 already build through their own
differently named toolchain files.

Assisted-by: Claude Code (Opus 5) <noreply@anthropic.com>
@fdesbiens
fdesbiens merged commit 010a6c9 into eclipse-threadx:dev Aug 12, 2026
4 checks passed
@fdesbiens
fdesbiens deleted the feature/cmake-gnu-ports branch August 12, 2026 16:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant